package se.stabby.undersok.interfaces;

import com.google.common.base.Preconditions;
import se.stabby.undersok.model.*;
import se.stabby.undersok.repository.PågåendeUndersökningRepository;
import se.stabby.undersok.repository.ResultatRepository;
import se.stabby.undersok.repository.TolkningsReporitory;
import se.stabby.undersok.repository.UndersökningRepository;

/**
 * User: per.segersten
 * Date: 2014-05-15
 */
public class UtföraUndersökningService {

    private final UndersökningRepository undersökningRepository;
    private final PågåendeUndersökningRepository pågåendeUndersökningRepository;
    private final ResultatRepository resultatRepository;
    private final TolkningsReporitory tolkningsReporitory;

    public UtföraUndersökningService(UndersökningRepository undersökningRepository,
                                     PågåendeUndersökningRepository pågåendeUndersökningRepository,
                                     ResultatRepository resultatRepository,
                                     TolkningsReporitory tolkningsReporitory) {
        this.undersökningRepository = undersökningRepository;
        this.pågåendeUndersökningRepository = pågåendeUndersökningRepository;
        this.resultatRepository = resultatRepository;
        this.tolkningsReporitory = tolkningsReporitory;
    }

    public Undersökning hämtaUndersökning(UndersökningsId id) {
        return undersökningRepository.sök(id);
    }

    /**
     * Startar en undersökning
     * @param undersökningsId
     * @return En undersökning eller null ifall den inte finns
     */
    public PågåendeUndersökning startaUndersökning(UndersökningsId undersökningsId) {

        Undersökning undersökning = undersökningRepository.sök(undersökningsId);

        if (undersökning==null) {
            return null;
        }
        // 2. Starta den
        PågåendeUndersökning pågåendeUndersökning = pågåendeUndersökningRepository.skapa(undersökning);

        return pågåendeUndersökning;
    }

    /**
     * Svara på en fråga
     * @param svar
     * @return nästa fråga eller null när alla är svarade
     */
    public Fråga svaraPåFråga(Svar svar) {
        Preconditions.checkNotNull(svar);

        PågåendeUndersökning pågåendeUndersökning = pågåendeUndersökningRepository.sök(svar.pågåendeUndersökningsId);
        Preconditions.checkNotNull(pågåendeUndersökning);

        PågåendeUndersökning uppdateradUndersökning = pågåendeUndersökning.läggTillSvar(svar);

        pågåendeUndersökningRepository.spara(uppdateradUndersökning);

        if (uppdateradUndersökning.ärKlar()) {
            Tolkare tolkare = tolkningsReporitory.sök(uppdateradUndersökning.undersökningId);
            Preconditions.checkNotNull(tolkare);
            resultatRepository.spara(tolkare.tolka(uppdateradUndersökning));
            return null;
        } else {
            return uppdateradUndersökning.nästaFråga();
        }
    }

    /**
     * Hämtar resultat på en undersökning
     * @param pågåendeUndersökningId
     * @return
     */
    public Resultat hämtaResultat(PågåendeUndersökningId pågåendeUndersökningId) {

        return resultatRepository.sök(pågåendeUndersökningId);
    }
}
